﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace MSH.Common.Helpers
{
    /// <summary>
    /// Deze helper is verantwoordelijk voor het loggen van meldingen in een file. 
    /// </summary>
    public static class LogHelper
    {
        private static object lockObject = new object();
        private static TextWriter _tw;
        private static DateTime _twTime;
        private static String _logFileDir;

        static LogHelper()
        {
            _logFileDir = System.Configuration.ConfigurationManager.AppSettings["logFileDir"].ToString();
            NewDayLogFile();
        }

        /// <summary>
        /// Geef de filenaam voor een nieuwe logfile (yyyyMMdd)
        /// </summary>
        /// <param name="timeNow">Datum voor in de filename</param>
        /// <returns>String met de file directory + name</returns>
        private static String CreateLogFileName(DateTime timeNow)
        {
            return String.Format("{0}\\{1}{2}{3}.txt", _logFileDir,_twTime.Year, _twTime.Month, _twTime.Day);
        }

        /// <summary>
        /// Maak een nieuwe logfile aan.
        /// </summary>
        private static void NewDayLogFile()
        {
            _twTime = DateTime.Now;
            try
            {
                _tw = new StreamWriter(CreateLogFileName(_twTime), true);
               
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }

        /// <summary>
        /// Logt een opgegeven string naar de logfile en de console.
        /// </summary>
        /// <param name="message">Een samengestelde formatterings string.</param>
        /// <param name="args">Array van te formatteren objecten.</param>
        public static void LogMessage(string message, params object[] args)
        {
            message = DateTime.Now.ToString() + " - " + String.Format(message, args);
            Console.WriteLine(message);
            WriteToLogFile(message);
        }

        /// <summary>
        /// Log het bericht en maak eventueel een nieuwe logfile als die er nog niet is voor de huidige dag.
        /// </summary>
        /// <param name="message">Bericht om te loggen</param>
        private static void WriteToLogFile(String message)
        {
            lock(lockObject)
            {
     
                TimeSpan ts = _twTime.Subtract(DateTime.Now);
                if (ts.Days >= 1)
                    NewDayLogFile();
            
                try
                {
                    _tw.Write(message + "\n");
                    _tw.Flush();
          
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }
            }
        }
    }
}
